package cn.feng.thinkInJava.a1_7_复用类.reusing.a7_08_02;

//: reusing/FinalOverridingIllusion.java
// It only looks like you can override
// a private or private final method.
import static net.mindview.util.Print.*;

/**
 * final和private关键字
 * 
 * @author fengyu
 * @date 2015年8月9日
 */
class WithFinals
{
	// Identical to "private" alone:
	private final void f()
	{
		print("WithFinals.f()");
	}
	
	// Also automatically "final":
	private void g()
	{
		print("WithFinals.g()");
	}
}

class OverridingPrivate extends WithFinals
{
	private final void f()
	{
		print("OverridingPrivate.f()");
	}
	
	private void g()
	{
		print("OverridingPrivate.g()");
	}
}

class OverridingPrivate2 extends OverridingPrivate
{
	public final void f()
	{
		print("OverridingPrivate2.f()");
	}
	
	public void g()
	{
		print("OverridingPrivate2.g()");
	}
}

public class FinalOverridingIllusion
{
	public static void main(String[] args)
	{
		OverridingPrivate2 op2=new OverridingPrivate2();
		op2.f();
		op2.g();
		// You can upcast:
		OverridingPrivate op=op2;
		// But you can't call the methods:
		// ! op.f();
		// ! op.g();
		// Same here:
		WithFinals wf=op2;
		// ! wf.f();
		// ! wf.g();
	}
} /* Output:
OverridingPrivate2.f()
OverridingPrivate2.g()
*///:~
